/*********************************************************************
 * SecObjectFactory.java created on Feb 2, 2010
 *
 * This file is part of Sure Tech Support Portal System. 
 * Copyright @ 2010 Sure Tech (HK) Limited. All rights reserved.
 * Sure Tech PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 *********************************************************************/
package com.bizdigger.db.pool;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

import org.apache.commons.pool.PoolableObjectFactory;

/**
 * @Author: Mac Wang
 * @Date: Feb 2, 2010 2:29:43 PM 
 * @Email: mac@suretech.com.hk
 */

public class SecObjectFactory implements PoolableObjectFactory {

	/**
	 * 这里，我们在使用对象的时候，需要首先激活这个对象，但是在多线程情况下，
	 * 这个对象已经被别的线程借去用了，那我们就要再建立一个对象。
 	 */  
	@Override
	public void activateObject(Object arg0) throws Exception {
		System.out.println("activate object:" + arg0);
	}

	/**
	 * 这里我们销毁这个对象。不用这个对象了，这个方法得在业务使用过程中主动调用。
	 * 在调用完这个方法过后，对象已经被销毁，但是在Object pool里面还是存在这个对象的
	 * 只是这个对象是null而已。所以在调用完destroyObject过后，要记得把pool清空一下。
	 */  
	@Override
	public void destroyObject(Object arg0) throws Exception {
		System.out.println("destory object:" + arg0);
		if(((Connection)arg0).isClosed() != true)
			((Connection)arg0).close();
	}

	/**
	 * 这里，在业务中第一次借对象的时候，这里要初始化一个，如果初始的都被借了，那就要继续初始
	 * 这里创建的对象将被存到pool里面
	 */  
	@Override
	public Object makeObject() throws Exception {
		Class.forName("com.mysql.jdbc.Driver").newInstance();
		Connection conn = DriverManager.getConnection("jdbc:mysql://192.168.10.206:3306/IPTV", "root", "suretech");
		conn.setAutoCommit(false);
		
		return conn;
	}

	/**
	 * 这里，在我们使用完每个对象过后，要做的就是归还，在归还后就要调用这个方法。
	 * 简单的说，在还款凭证上面签个大名
	 */  
	@Override
	public void passivateObject(Object arg0) throws Exception {
		System.out.println("passivate object:" + arg0);
	}

	/**
	 * 这个方法是验证对象，这里我们不做处理，这里在借对象和还对象的时候都要验证下的。
	 */  
	@Override
	public boolean validateObject(Object arg0) {
		System.out.println("validate object:" + arg0);
		
		try
		{
			if(((Connection)arg0).isClosed() == false)
				return true;
			else
				return false;
		}
		catch(SQLException e)
		{
			e.printStackTrace();
			return false;
		}
	}

}
